#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/wait.h>

int main()
{
  //创建子进程
  pid_t pc = fork();
  if(pc==0)
  {
    printf("我是子进程！子进程编号：%d，父进程编号：%d\n",getpid(),getppid());
    sleep(2);
    //变成僵尸进程
    exit(0);
  }
  else
  {
    int status;
    printf("我是父进程！子进程编号：%d，父进程编号：%d\n",getpid(),getppid());
    //回收子进程
    pid_t d = waitpid(-1,&status,0);
    if(d>0)
    {
      printf("回收子进程成功！编号%d\n",d);
    }
    else if(d==0)
    {
      printf("没有子进程退出!\n");
    }
    else{
      printf("执行错误!\n");
    }

    //获取子进程的退出状态
    if(WIFEXITED(status))
    {
      printf("子进程%d正常退出,退出码%d\n!",getpid(),WIFEXITED(status));
    }
  }

  return 0;
}


//int main()
//{
//  FILE *pc = fopen("nonexistent.txt", "r");
//
//  if(pc)
//  {
//    printf("错误码：%d，错误信息：%s\n",errno,strerror(errno));
//    exit(errno);
//  }
//
//  return 0;
//}

//
//int main()
//{
//    FILE *fp = fopen("nonexist.txt", "r");
//    if (fp == NULL) {
//        // 直接返回系统设置的errno（如文件不存在时，errno为2）
//       // return errno; 
//    }
//    fclose(fp);
//    return 0; // 正常退出，返回0
//}

//
//int main()
//{
//  //访问野指针
//  int* pc=null;
//  *pc=10;
//  if(pc)
//  {
//    return errno;
//  }
//  //程序正常退出
//  return 0;
//}
//






//int main()
//{
//  int a =9;
//  if(a<10)
//  {
//    int *pc=(int*)malloc(1000*1000*1000);
//   // printf("%s\n",strerror(errno));
//    return errno;
//  }
//
// // int ret = 5;
// // ret/=0;
//// int* pc=(int*)malloc(1000*1000*1000*1000);
//  return 0;
//}

//in//t main()
//{
//  int n = 10;
//  pid_t d = fork();
//  
//  if(d==0)
//  {
//    printf("这是子进程! n=%d，n的地址为%p，父进程:%d，子进程:%d\n",n,&n,getpid(),getppid());
//    printf("修改n之后：\n");
//    n=100;
//    printf("这是子进程! n=%d，n的地址为%p\n",n,&n);
//  }
//  else
//  {
//    printf("这是父进程! n=%d，n的地址为%p，父进程:%d，子进程:%d\n",n,&n,getpid(),getppid());
//    printf("修改n之后：\n");
//    n=1000;
//    printf("这是父进程！n=%d，n的地址为%p\n",n,&n);
  //devar}
//int main(int argc,char *argv[],char *env[])
//{
// // int i=0;
 // for(;env[i];i++)
 // {
 //   printf("所有环境变量内容是%s\n",env[i]);
 // }
////  int i=0;
//  for(;getenv(i);i++)
 //.autorelabel {
    //tmproc printf("这个环境变量的内容是:%s\n",getenv("HOME"));
//  pid_t d = fork();
//
//  if(d>0)
//  {
//    printf("这是父进程哦!");
//    printf("子进程:%d,父进程:%d\n",getpid(),getppid());
//  }
//  else if(d==0)
//  {
//    printf("这是子进程哦!");
//    printf("子进程:%d,父进程:%d\n",getpid(),getppid());
//  }
//  else
//  {
//    printf("创建进程失败!\n");
//  }
//
//	return 0;
//}

